package isanfeng.tuxiaoer.pattern.structural.decorator.v2;

/**
 * 装饰者模式
 * 定义：在不改变原有对象的基础上，将功能附加到对象上
 *      提供了比继承更有弹性的替代方案（扩展了原有对象的功能）
 * 场景：
 *    生活场景：房子装修，定做蛋糕
 *    适用场景：
 *          扩展一个类的功能或给一个类添加附加职责
 *          动态的给一个对象添加功能，这些功能可以再动态的撤销
 * 优点：
 *    继承能力的有力的补充，比继承灵活，不改变原有对象的情况下给一个对象扩展功能
 *      通过使用不同装饰类以及这些装饰类的排列组合，可以实现不同效果
 * 符合开闭原则
 * 相关的设计模式
 * 装饰者模式和代理模式
 * 装饰者模式和适配器模式
 * 源码：IO
 * BufferedReader
 * @author 李红辉
 * @version 1.0
 * @date 2019/10/12 18:28
 */
public class Test {
    public static void main(String[] args) {
        ABatterCake aBatterCake = new BatterCake();
        // 加一个鸡蛋
        aBatterCake = new EggDecorator(aBatterCake);
        // 加一个鸡蛋
        aBatterCake = new EggDecorator(aBatterCake);

        aBatterCake = new EggDecorator(aBatterCake);
        // 加一根香肠
        aBatterCake = new SausageDecorator(aBatterCake);
        System.out.println(aBatterCake.getDesc() + aBatterCake.getPrice());
    }
}
